字符串问题——字符串的统计字符串

题目:给定一个字符串str,返回str的统计字符串。如”aaabbadddffc”的统计字符串为:”a_3_b_2_a_1_d_3_f_2_c_1”。
题目补充:给定字符串的统计字符串cstr,再给定一个整数index,返回cstr所代表的的原始字符串上的第index个字符。如”a_1_b_100”所代表的原始字符串的第0个字符为a,第50个字符为b。

实现:

  1. 如果str为空,则统计字符串不存在
  2. 如果str不为空。首先生成StringBuffer类型的对象rst,表示统计字符串;生成整型变量num,代表当前字符的数量。初始状态rst=str[0],且num=1。
  3. 遍历字符串str,如果str[i]==str[i-1],则num++;如果str[i]!=str[i-1],则说明前面相同字符str[i-1]已经统计完,令rst=rst.append(rst + ‘_‘ + num + _ + str[i]),重置num=1。然后依次遍历下去。
  4. 当遍历到最后一个字符,发现最后一个字符已经放入,但其个数还未放入,最后令rst=rst+’_‘+num。
    我用的StringBuffer生成统计字符串,避免产生多个String

问题2实现:

  1. 给定的统计字符串如cstr=”a_3_b_2_a_1_d_3_f_2_c_1”,其中有三种字符,字母、下划线和数字。定义stage,stage=true表示遇到的是字符,当遇到”-“,stage=!stage,为false,表示该转向数字阶段了。
  2. 字符变量cur,表示上次遇到的连续字符;整型变量num表示上一个遇到连续字符的时候,字符出现的次数;整型变量sum表示遍历到目前位置相当于在原字符串的什么位置。
  3. 初始化stage=true,cur=0(字符编码为0表示空字符串),num=0,sum=0。
  4. 当遇到一个新的字符,即stage=true时,sum+=num,代表前面已经有多少个字符了,若index>sum,说明还没遍历到原字符串的index位置的字符;若index已到达,则返回上一个字符。
  5. 最后需要将最后一个字符的num加到sum上。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class GetCountStr {
/**
* 统计一个字符串中每个连续字符出现的次数
* @param str 原字符串
* @return 统计字符串
*/
public String getCountStr(String str) {
if (str == null || str.equals("")) {
return "";
}
StringBuffer sb = new StringBuffer();
char[] chas = str.toCharArray();
sb = sb.append(chas[0]);
int num = 1;
for (int i = 1; i < chas.length; i++) {
if (chas[i] == chas[i-1]) {
num++;
} else {
sb.append("_" + num + "_" + chas[i]);
num = 1;
}
}
sb.append("_" + num);
return sb.toString();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* 根据统计字符串返回目标位置的字符
* @param str 统计字符串
* @param index 原字符串中的下标
* @return 原字符串下标位置的字符
*/
public char getCharAt(String cstr, int index) {
if (cstr == null || cstr.equals("") || index < 1) {
return 0;
}
int sum = 0;
int num = 0;
char cur = 0; //字符编码为0表示空串
boolean stage = true;
char[] chas = cstr.toCharArray();
for (int i = 0; i < chas.length; i++) {
if (chas[i] == '_'){
stage = !stage;
} else if (stage) { //遇到字符,开始统计前一个字符
sum += num;
num = 0;
if (index < sum) {
return cur;
}
cur = chas[i];
} else { //遇到数字
num += 10*num + chas[i] - '0';
}
}
return sum + num > index ? cur : 0; //最后一个数字加上去
}
1
2
3
4
5
6
7
8
9
10
	//Test
public static void main(String[] args) {
GetCountStr gc = new GetCountStr();
String str = "aaabbadddffc";
String cstr = gc.getCountStr(str);
System.out.println(cstr);
char cha = gc.getCharAt(cstr, 2);
System.out.println(cha);
}
}

输出:

1
2
a_3_b_2_a_1_d_3_f_2_c_1
a